home *** CD-ROM | disk | FTP | other *** search
- /**
- AEFX_SampleUI.c
-
- Part of the Adobe After Effects 3.1 SDK
- Copyright (c)1993-96, Adobe Systems Inc, All Rights Reserved.
-
- A simple After Effects plug-in with a custom user interface demonstrating
- the use of PF_Cmd_Event. UI event handling is taken care of here.
-
- Revision History
- 1.0, created by dmw
- **/
-
- #include "AEFX_Sample.h"
-
- enum {
- SAM_None = 0,
- SAM_Handles,
- SAM_Rect
- };
-
-
- static void FrameFromParams (
- PF_InData *in_data,
- PF_ParamDef *params[],
- Rect *frame )
- {
- long x_rad, y_rad, x, y;
-
- x_rad = FIX2INT(params[1]->u.fd.value);
- y_rad = FIX2INT(params[2]->u.fd.value);
- x = FIX2INT(params[3]->u.td.x_value);
- y = FIX2INT(params[3]->u.td.y_value);
- frame->top = y-y_rad;
- frame->bottom = y+y_rad;
- frame->left = x-x_rad;
- frame->right = x+x_rad;
- }
-
- #define OVAL_PTS 64
-
- static PF_FixedPoint std_oval[OVAL_PTS];
-
- static void InitOval (
- PF_InData *in_data,
- PF_FixedPoint *pts )
- {
- double rad;
- short i;
-
- for (i=0; i<OVAL_PTS; i++) {
- rad = (2.0*i*PF_PI)/OVAL_PTS;
- pts[i].x = FLOAT2FIX(PF_SIN(rad));
- pts[i].y = FLOAT2FIX(PF_COS(rad));
- }
- }
-
-
- static void TransformOval (
- PF_InData *in_data,
- PF_FixedPoint *corners,
- Point *transformed )
- {
- PF_FixedPoint center;
- PF_FpLong angle;
- PF_FpLong dx, dy;
- PF_FpLong x_rad, y_rad;
- PF_FloatMatrix mat;
- long i;
- PF_FixedPoint copy_pts[OVAL_PTS];
-
- center.x = INT2FIX(corners[0].x + corners[2].x) / 2;
- center.y = INT2FIX(corners[0].y + corners[2].y) / 2;
-
- dx = corners[1].x - corners[0].x;
- dy = corners[1].y - corners[0].y;
-
- angle = PF_ATAN2(dy, dx);
- angle /= PF_RAD_PER_DEGREE;
-
- x_rad = PF_SQRT(dx*dx + dy*dy) / 2.0;
-
- dx = corners[2].x - corners[1].x;
- dy = corners[2].y - corners[1].y;
- y_rad = PF_SQRT(dx*dx + dy*dy) / 2.0;
-
- SAM_SetIdentityMatrix(&mat);
- SAM_ScaleMatrix(&mat, x_rad, y_rad, 0, 0);
- SAM_RotateMatrixPlus(&mat, in_data, angle, 0, 0);
-
- for (i=0; i<OVAL_PTS; i++) {
- copy_pts[i].x = std_oval[i].x;
- copy_pts[i].y = std_oval[i].y;
- }
-
- SAM_TransformFixPoints(&mat, OVAL_PTS, copy_pts);
-
- for (i=0; i<OVAL_PTS; i++) {
- transformed[i].h = FIX2INT_ROUND(copy_pts[i].x + center.x);
- transformed[i].v = FIX2INT_ROUND(copy_pts[i].y + center.y);
- }
- }
-
-
- static void MyDrawOval (
- PF_InData *in_data,
- PF_FixedPoint *corners )
- {
- Point poly_oval[OVAL_PTS];
- short i;
- TransformOval(in_data, corners, poly_oval);
-
- MoveTo(poly_oval[0].h, poly_oval[0].v);
-
- for (i=0; i<OVAL_PTS; i++) {
- LineTo(poly_oval[i].h, poly_oval[i].v);
- }
-
- LineTo(poly_oval[0].h, poly_oval[0].v);
-
- }
-
-
- static void FixedFrameFromParams (
- PF_InData *in_data,
- PF_ParamDef *params[],
- PF_FixedRect *frame )
- {
- long x_rad, y_rad, x, y;
-
- x_rad = (params[1]->u.fd.value);
- y_rad = (params[2]->u.fd.value);
- x = (params[3]->u.td.x_value);
- y = (params[3]->u.td.y_value);
- frame->top = y-y_rad;
- frame->bottom = y+y_rad;
- frame->left = x-x_rad;
- frame->right = x+x_rad;
- }
-
-
- static void LayerFrame2Layer (
- PF_InData *in_data, /* >> */
- PF_EventExtra *extra, /* >> */
- Point *frame, /* >> */
- Point *lyr, /* << */
- PF_FixedPoint *fix_lyr ) /* << */
- {
- fix_lyr->x = INT2FIX(frame->h);
- fix_lyr->y = INT2FIX(frame->v);
- (void)extra->cbs.frame_to_source(extra->cbs.refcon, extra->contextH, fix_lyr);
- // now back into layer space
- lyr->h = FIX2INT(fix_lyr->x);
- lyr->v = FIX2INT(fix_lyr->y);
- }
-
-
- static void CompFrame2Layer (
- PF_InData *in_data, /* >> */
- PF_EventExtra *extra, /* >> */
- Point *frame, /* >> */
- Point *lyr, /* << */
- PF_FixedPoint *fix_lyr ) /* << */
- {
- fix_lyr->x = INT2FIX(frame->h);
- fix_lyr->y = INT2FIX(frame->v);
- (void)extra->cbs.frame_to_source(extra->cbs.refcon, extra->contextH, fix_lyr);
- // now back into layer space
- (void)extra->cbs.comp_to_layer(extra->cbs.refcon, extra->contextH, in_data->current_time, in_data->time_scale, fix_lyr);
- lyr->h = FIX2INT(fix_lyr->x);
- lyr->v = FIX2INT(fix_lyr->y);
- }
-
-
- static void Layer2CompFrame (
- PF_InData *in_data, /* >> */
- PF_EventExtra *extra, /* >> */
- Point *layer, /* >> */
- Point *frame, /* << */
- PF_FixedPoint *fix_frame ) /* << */
- {
- fix_frame->x = INT2FIX(layer->h);
- fix_frame->y = INT2FIX(layer->v);
- (void)extra->cbs.layer_to_comp(extra->cbs.refcon, extra->contextH, in_data->current_time, in_data->time_scale, fix_frame);
- (void)extra->cbs.source_to_frame(extra->cbs.refcon, extra->contextH, fix_frame);
- frame->h = FIX2INT(fix_frame->x);
- frame->v = FIX2INT(fix_frame->y);
- }
-
-
- static void Layer2LayerFrame (
- PF_InData *in_data, /* >> */
- PF_EventExtra *extra, /* >> */
- Point *layer, /* >> */
- Point *frame, /* << */
- PF_FixedPoint *fix_frame ) /* << */
- {
- fix_frame->x = INT2FIX(layer->h);
- fix_frame->y = INT2FIX(layer->v);
- (void)extra->cbs.source_to_frame(extra->cbs.refcon, extra->contextH, fix_frame);
- frame->h = FIX2INT(fix_frame->x);
- frame->v = FIX2INT(fix_frame->y);
- }
-
-
- static void Source2FrameRect (
- PF_InData *in_data,
- PF_EventExtra *extra,
- PF_FixedRect *fx_frame,
- PF_FixedPoint *pts ) // array of four -> shows real bounding box
-
- {
- short i;
-
- pts[0].x = (fx_frame->left);
- pts[0].y = (fx_frame->top);
-
- pts[1].x = (fx_frame->right);
- pts[1].y = (fx_frame->top);
-
- pts[2].x = (fx_frame->right);
- pts[2].y = (fx_frame->bottom);
-
- pts[3].x = (fx_frame->left);
- pts[3].y = (fx_frame->bottom);
-
- if ((*extra->contextH)->w_type == PF_Window_COMP) {
- for (i=0; i<4; i++) {
- (void)extra->cbs.layer_to_comp(extra->cbs.refcon, extra->contextH, in_data->current_time, in_data->time_scale, &pts[i]);
- }
- }
- for (i=0; i<4; i++) {
- (void)extra->cbs.source_to_frame(extra->cbs.refcon, extra->contextH, &pts[i]);
- }
-
- fx_frame->top = pts[0].y;
- fx_frame->bottom = pts[2].y;
- fx_frame->left = pts[0].x;
- fx_frame->right = pts[1].x;
- }
-
-
- static void DrawHandles (
- PF_InData *in_data,
- PF_ParamDef *params[],
- PF_EventExtra *extra )
- {
- short i;
- Rect box;
- Rect frame;
- PF_FixedRect fx_frame;
- PF_FixedPoint pts[4];
-
- FixedFrameFromParams(in_data, params, &fx_frame);
- Source2FrameRect(in_data, extra, &fx_frame, pts);
-
- PF_FIXEDRECT_2_RECT(fx_frame, frame);
-
- for (i=0; i<4; i++) {
- pts[i].x = FIX2INT_ROUND(pts[i].x);
- pts[i].y = FIX2INT_ROUND(pts[i].y);
-
- }
-
- if ((*extra->contextH)->w_type == PF_Window_COMP) {
- MyDrawOval(in_data, pts);
-
- for (i=0; i<4; i++) {
- box.top = pts[i].y-3;
- box.bottom = pts[i].y+3;
- box.left = pts[i].x-3;
- box.right = pts[i].x+3;
- InvertRect(&box);
- }
- } else {
- FrameOval(&frame);
-
- box.top = frame.top-3;
- box.bottom = frame.top+3;
- box.left = frame.left-3;
- box.right = frame.left+3;
- InvertRect(&box);
-
- box.top = frame.top-3;
- box.bottom = frame.top+3;
- box.left = frame.right-3;
- box.right = frame.right+3;
- InvertRect(&box);
-
- box.top = frame.bottom-3;
- box.bottom = frame.bottom+3;
- box.left = frame.left-3;
- box.right = frame.left+3;
- InvertRect(&box);
-
- box.top = frame.bottom-3;
- box.bottom = frame.bottom+3;
- box.left = frame.right-3;
- box.right = frame.right+3;
- InvertRect(&box);
-
- }
- }
-
-
- static PF_Err DrawEvent (
- PF_InData *in_data,
- PF_OutData *out_data,
- PF_ParamDef *params[],
- PF_LayerDef *output,
- PF_EventExtra *event_extra )
- {
- PF_Err err = PF_Err_NONE;
- GrafPtr dp = (*(event_extra->contextH))->cgrafptr;
- short old_pen;
-
- // stuff params into globals -- we need amount & type
-
- if ((*event_extra->contextH)->w_type == PF_Window_LAYER ||
- (*event_extra->contextH)->w_type == PF_Window_COMP) {
-
- old_pen = dp->pnMode;
- PenMode(patXor);
- DrawHandles(in_data, params, event_extra);
- PenMode(old_pen);
-
- event_extra->evt_out_flags = PF_EO_HANDLED_EVENT;
- // old style:
- // event_extra->handled_evt = TRUE;
- }
-
- return err;
- }
-
-
- static PF_Err NewContext (
- PF_InData *in_data,
- PF_OutData *out_data,
- PF_ParamDef *params[],
- PF_LayerDef *output,
- PF_EventExtra *event_extra )
- {
- PF_Err err = PF_Err_NONE;
- return err;
- }
-
-
- static Boolean DoClickHandles (
- PF_InData *in_data,
- Rect *frame,
- PF_ParamDef *params[],
- FrameFunc frame_func,
- PF_EventExtra *extra )
- {
- Boolean done = FALSE;
- Point mouse_down;
- PF_FixedPoint mouse_layer;
- Point corners[4];
- PF_FixedPoint center;
-
- short i;
- long slop;
- long hit;
-
- center.x = params[3]->u.td.x_value;
- center.y = params[3]->u.td.y_value;
-
- corners[0].h = frame->left;
- corners[0].v = frame->top;
-
- corners[1].h = frame->right;
- corners[1].v = frame->top;
-
- corners[2].h = frame->right;
- corners[2].v = frame->bottom;
-
- corners[3].h = frame->left;
- corners[3].v = frame->bottom;
-
- mouse_down = extra->u.do_click.screen_point;
- hit = -1;
-
- for (i=0; i<4; i++) {
- // convert corners to comp frame
- (*frame_func)(in_data, extra, &corners[i], &corners[i], &mouse_layer);
- slop = ABS(corners[i].h - mouse_down.h);
- slop += ABS(corners[i].v - mouse_down.v);
-
- if (slop < SAM_SLOP) {
- hit = i;
- done = TRUE;
- extra->u.do_click.send_drag = TRUE;
- extra->u.do_click.continue_refcon[0] = SAM_Handles;
- extra->u.do_click.continue_refcon[1] = mouse_layer.x;
- extra->u.do_click.continue_refcon[2] = mouse_layer.y;
- extra->u.do_click.continue_refcon[3] = FALSE;
- break;
- }
- }
-
- return done;
- }
-
-
- static Boolean DoDragHandles (
- PF_InData *in_data,
- PF_ParamDef *params[],
- FrameFunc frame_func,
- PF_EventExtra *extra )
- {
- Boolean done = FALSE;
- Point mouse_down;
- PF_FixedPoint mouse_layer;
- PF_FixedPoint center, old_center;
- long old_x, old_y;
- Boolean draw = TRUE;
-
- // old style -- comment out this line
-
- if ((extra->evt_in_flags & PF_EI_DONT_DRAW) != 0) {
- draw = FALSE;
- }
-
- mouse_down = extra->u.do_click.screen_point;
- (*frame_func)(in_data, extra, &mouse_down, &mouse_down, &mouse_layer);
-
- old_center.x = extra->u.do_click.continue_refcon[1];
- old_center.y = extra->u.do_click.continue_refcon[2];
-
- center.x = params[3]->u.td.x_value;
- center.y = params[3]->u.td.y_value;
-
- if (extra->u.do_click.continue_refcon[3] == FALSE) {
- if (draw) DrawHandles(in_data, params, extra); // draw new
- }
- old_x = params[1]->u.fd.value;
- old_y = params[2]->u.fd.value;
-
- params[1]->u.fd.value = ABS(center.x - mouse_layer.x);
- params[2]->u.fd.value = ABS(center.y - mouse_layer.y);
- params[1]->changed = TRUE;
- params[2]->changed = TRUE;
-
- if (draw) {
- DrawHandles(in_data, params, extra); // draw new
- params[1]->u.fd.value = old_x;
- params[2]->u.fd.value = old_y;
- DrawHandles(in_data, params, extra); // erase old
- params[1]->u.fd.value = ABS(center.x - mouse_layer.x);
- params[2]->u.fd.value = ABS(center.y - mouse_layer.y);
- }
-
- done = TRUE;
- extra->u.do_click.send_drag = TRUE;
- extra->u.do_click.continue_refcon[0] = SAM_Handles;
- extra->u.do_click.continue_refcon[1] = mouse_layer.x;
- extra->u.do_click.continue_refcon[2] = mouse_layer.y;
- extra->u.do_click.continue_refcon[3] = TRUE;
-
- if (extra->u.do_click.last_time) {
- extra->u.do_click.continue_refcon[0] = 0;
- extra->u.do_click.send_drag = FALSE;
- if (draw) DrawHandles(in_data, params, extra); // draw new
- }
-
- return done;
-
- }
-
-
- static Boolean DoClickRect (
- PF_InData *in_data,
- Rect *frame,
- PF_ParamDef *params[],
- FrameFunc frame_func,
- PF_EventExtra *extra )
- {
- Boolean done = FALSE;
- Point mouse_down;
- PF_FixedPoint mouse_layer;
-
- mouse_down = extra->u.do_click.screen_point;
- (*frame_func)(in_data, extra, &mouse_down, &mouse_down, &mouse_layer);
-
- if (PtInRect(mouse_down, frame)) {
- done = TRUE;
- extra->u.do_click.send_drag = TRUE;
- extra->u.do_click.continue_refcon[0] = SAM_Rect;
- extra->u.do_click.continue_refcon[1] = mouse_layer.x;
- extra->u.do_click.continue_refcon[2] = mouse_layer.y;
- extra->u.do_click.continue_refcon[3] = FALSE;
-
- }
-
- return done;
- }
-
-
- static Boolean DoDragRect (
- PF_InData *in_data,
- PF_ParamDef *params[],
- FrameFunc frame_func,
- PF_EventExtra *extra )
- {
- Boolean done = FALSE;
- Point mouse_down;
- PF_FixedPoint mouse_layer;
- PF_FixedPoint d;
- Boolean draw = TRUE;
-
- // old style -- comment out this line
-
- if ((extra->evt_in_flags & PF_EI_DONT_DRAW) != 0) {
- draw = FALSE;
- }
-
- mouse_down = extra->u.do_click.screen_point;
- (*frame_func)(in_data, extra, &mouse_down, &mouse_down, &mouse_layer);
-
- d.x = mouse_layer.x - extra->u.do_click.continue_refcon[1];
- d.y = mouse_layer.y - extra->u.do_click.continue_refcon[2];
-
- if (extra->u.do_click.continue_refcon[3] == FALSE) {
- if (draw)
- DrawHandles(in_data, params, extra); // draw new
- }
- params[3]->u.td.x_value += (d.x);
- params[3]->u.td.y_value += (d.y);
- params[3]->changed = TRUE;
-
- if (draw) {
- DrawHandles(in_data, params, extra); // draw new
- params[3]->u.td.x_value -= (d.x);
- params[3]->u.td.y_value -= (d.y);
- DrawHandles(in_data, params, extra); // erase old
- params[3]->u.td.x_value += (d.x);
- params[3]->u.td.y_value += (d.y);
- }
-
- done = TRUE;
- extra->u.do_click.send_drag = TRUE;
- extra->u.do_click.continue_refcon[0] = SAM_Rect;
- extra->u.do_click.continue_refcon[1] = mouse_layer.x;
- extra->u.do_click.continue_refcon[2] = mouse_layer.y;
- extra->u.do_click.continue_refcon[3] = TRUE;
-
- if (extra->u.do_click.last_time) {
- extra->u.do_click.continue_refcon[0] = 0;
- extra->u.do_click.send_drag = FALSE;
- if (draw) DrawHandles(in_data, params, extra); // draw new
- }
-
- return done;
-
- }
-
-
- static PF_Err DoClick (
- PF_InData *in_data,
- PF_OutData *out_data,
- PF_ParamDef *params[],
- PF_LayerDef *output,
- PF_EventExtra *event_extra )
- {
- PF_Err err = PF_Err_NONE;
- PF_ContextH contextH = event_extra->contextH;
- GrafPtr dp = (*(event_extra->contextH))->cgrafptr;
- Rect frame;
- short oldPat = dp->pnMode;
-
- FrameFromParams(in_data, params, &frame);
- PenMode(patXor);
-
- if ((*contextH)->w_type == PF_Window_LAYER) {
- if (DoClickHandles(in_data, &frame, params, Layer2LayerFrame, event_extra)) {
- event_extra->evt_out_flags = PF_EO_HANDLED_EVENT;
- } else if (DoClickRect(in_data, &frame, params, LayerFrame2Layer, event_extra)) {
- event_extra->evt_out_flags = PF_EO_HANDLED_EVENT;
- }
-
- } else if ((*contextH)->w_type == PF_Window_COMP) {
- if (DoClickHandles(in_data, &frame, params, Layer2CompFrame, event_extra)) {
- event_extra->evt_out_flags = PF_EO_HANDLED_EVENT;
- } else if (DoClickRect(in_data, &frame, params, CompFrame2Layer, event_extra)) {
- event_extra->evt_out_flags = PF_EO_HANDLED_EVENT;
- }
- }
-
- PenMode(oldPat);
-
- return err;
- }
-
-
- static PF_Err DoDrag (
- PF_InData *in_data,
- PF_OutData *out_data,
- PF_ParamDef *params[],
- PF_LayerDef *output,
- PF_EventExtra *event_extra )
- {
- PF_Err err = PF_Err_NONE;
- PF_ContextH contextH = event_extra->contextH;
- PF_DoClickEventInfo do_click;
- GrafPtr dp = (*(event_extra->contextH))->cgrafptr;
- Rect frame;
- short oldPat = dp->pnMode;
- FrameFunc frame_func = NULL;
-
- FrameFromParams(in_data, params, &frame);
- PenMode(patXor);
-
- do_click = event_extra->u.do_click;
-
- if ((*contextH)->w_type == PF_Window_LAYER) {
- frame_func = LayerFrame2Layer;
- } else if ((*contextH)->w_type == PF_Window_COMP) {
- frame_func = CompFrame2Layer;
- }
-
- if (frame_func) {
- switch (do_click.continue_refcon[0]) {
-
- case SAM_Rect:
- DoDragRect(in_data, params, frame_func, event_extra);
- event_extra->evt_out_flags = PF_EO_HANDLED_EVENT;
- // old style:
- // event_extra->handled_evt = TRUE;
- break;
-
- case SAM_Handles:
- DoDragHandles(in_data, params, frame_func, event_extra);
- event_extra->evt_out_flags = PF_EO_HANDLED_EVENT;
- // old style:
- // event_extra->handled_evt = TRUE;
- break;
- }
- }
-
- PenMode(oldPat);
-
- return err;
- }
-
-
- PF_Err HandleEvent (
- PF_InData *in_data,
- PF_OutData *out_data,
- PF_ParamDef *params[],
- PF_LayerDef *output,
- PF_EventExtra *event_extra )
- {
- PF_Err err = PF_Err_NONE;
-
- if (event_extra->e_type == PF_Event_DO_CLICK) {
- if (event_extra->u.do_click.send_drag) event_extra->e_type = PF_Event_DRAG;
- }
-
- switch (event_extra->e_type) {
-
- case PF_Event_NEW_CONTEXT:
- InitOval(in_data, std_oval);
- NewContext(in_data, out_data, params, output, event_extra);
- break;
-
- case PF_Event_ACTIVATE:
- break;
-
- case PF_Event_DO_CLICK:
- DoClick(in_data, out_data, params, output, event_extra);
- break;
-
- case PF_Event_DRAG:
- DoDrag(in_data, out_data, params, output, event_extra);
- break;
-
- case PF_Event_DRAW:
- DrawEvent(in_data, out_data, params, output, event_extra);
- break;
-
- case PF_Event_DEACTIVATE:
- break;
-
- case PF_Event_CLOSE_CONTEXT:
- break;
-
- case PF_Event_IDLE:
- break;
-
- default:
- DebugStr("\p Unknown event");
- break;
-
- }
-
- return err;
- }
-